#include<iostream>
using namespace std;
//拷贝构造函数的核心：拷贝构造函数是构造函数的一个重载形式

// class Date
// {
// public:
// //构造函数
// Date(int year = 2025,int month = 4,int day = 27)
// {
//     _year = year;
//     _month = month;
//     _day = day;
// }
// //析构函数：没必要定义显示的析构函数

// //拷贝构造函数
// //拷贝构造函数是构造函数的一个重载形式
// //拷贝构造函数的参数只有一个是该类 类型对象的引用
// //使用传值编译器直接报错：因为会引发无穷的递归调用。

// //Date(Date d)

// //不加引用的话：Date d(d1) 
  //              Date d(d1)


// //为什么这里要加上const
// //因为你拷贝构造函数的目的：是完成值拷贝的工作 + 拷贝构造函数的参数有&
// //所以这里你最好加上一个const

// Date(Date& d)
// {

//     _year = d._year;
//     _month = d._month;
//     _day = d._day;
//     d._day = 32;
// }
// void print()
// {
//   cout <<_year<<" " <<_month<<" "<<_day <<'\n';
// }
// private:
// int _year;
// int _month;
// int _day;
// //private 修饰的变量只能在该类中访问
// };
// int main()
// {
//   //创建对象
//   Date d1;
//   Date d2(d1);
//   cout << &d1 <<'\n';
//   cout << &d2 <<'\n';
//   d1.print();
//   d2.print();
//   return 0;
// }



//若没有显示定义的拷贝构造函数，编译器会自动生成默认的的拷贝构造函数
//用户没有显示定义，编译器自动生成的函数称之为默认成员函数






//拷贝分为：深拷贝和浅拷贝
//默认的拷贝构造函数内置类型按字节直接拷贝的
//自定义类型是调用其拷贝构造函数完成拷贝


//设计题：编译器自动生成的拷贝构造函数的作用

//验证编译器自动生成的默认拷贝构造函数对自定义类型的作用

// class Time
// {
//   public:
// Time()
// {

// }
//   //拷贝构造函数
//   Time(const Time& t)
//   {
//     cout <<"copy_constructor"<<'\n';
//   }

//    private:
//    int _hour;
//    int _minute;
//    int _second;
// };


// class Date
// {
//   //class的成员变量和成员方法的默认访问限定符是private
//   public:
//   Date(int year = 2025,int month = 4 ,int day = 27)
//   {
//       _year = year;
//       _month = month;
//       _day = day;
//   }
//   void Print()
//   {
//     cout <<_year <<" "<<_month <<" "<<_day<<'\n';
//   }
//     private:
//     //默认的拷贝构造函数：对内置类型：按字节进行拷贝
//     //内置类型：
//     int _year;
//     int _month;
//     int _day;
//     //自定义类型
//     Time _t;
// };
// int main()
// {
//   //创建对象 Date d1() -> 这会被编译器解析为一个函数的声明
//   Date d1;
//   Date d2(d1);
//   // d1.Print();
//   // d2.Print();
//   return 0;
// }


//什么是深拷贝
//一个类的成员变量使用malloc向内存中申请4个字节的空间
//创建对象 _a 
//使用拷贝构造函数来给_b(新对象)初始化。由于在类中没有显示定义拷贝构造函数
//对于内置类型：会按照字节进行值拷贝的
//这是成员变量 _a中_c 和_b中成员变量都指向同一块空间
//对象的生命周期结束时，C++编译系统自动调用析构函数，完成对对象中资源的清理工作

//对同一块地址空间进行两次析构，会造成程序崩溃的

// -> 为什么构造函数、析构函数和拷贝构造函数对于内置类型不做处理、对于自定义类型
//    




